package com.itbaizhan;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/**jdbc工具类*/
/*在工具类的方法都是静态方法*/
public class JdbcUtils {
    //变量在下面的static区中,所以这里定义也要static
    private static String url;
    private static  String name;
    private static  String pwd;
   /*用static块，存放properties文件信息，因为这只要加载一次，
   就存在静态区,而且加载了就会自动实例化*/
    static{
        try{
            //实例化Properties对象
            Properties prop = new Properties();
            //获取读取properties文件的字节输入流对象
            InputStream is = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
            //读取properties文件并解析
            prop.load(is);
            /*这样写是局部变量，下面的Connection，不可以获取到值，所以要在上面定义
            * 成员变量*/
            //String url = prop.getProperty("url");
           //获取连接数据库信息
            url = prop.getProperty("url");
            name = prop.getProperty("username");
            pwd = prop.getProperty("pwd");
            //这个Connection不要用，所以不用定义成员变量
            //获取数据库驱动全名
            String driverName = prop.getProperty("driver");
            //加载并注册驱动 DriverManager  实例化一次就可以，所以放在static块中
            Class.forName(driverName);

        }catch (Exception e){
            e.printStackTrace();
        }
   }
    //获取数据库连接对象
    //要有返回值，Connection对象
    /*不可以在getConnection方法里放properties文件，因为读取文件时
    * 要iO流，那样每次调用getConnection方法时，都要启动IO流，频繁操作IO
    * 流对系统耗时，而且获取properties信息，只获取一次就可以了*/
    public static Connection getConnection(){

        //要在try-catch外定义Connection,才可以return
        Connection connection = null;
        //通过驱动管理器对象获取连接对象
        /*在工具类的异常要用try-catch,不可以抛出去*/
        try {
            //这样定义不可以返回Connection对象
        //Connection  connection = DriverManager.getConnection("","","");
           connection = DriverManager.getConnection(url,name,pwd);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    /*关闭Connection对象*/
    public static void closeConnection(Connection connection){
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    /*提交事务*/
    public static void commit(Connection connection){
        try {
            connection.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    /*事务回滚*/
    public static void rollback(Connection connection){
        try {
            connection.rollback();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    //关闭statement对象
    //因为PreparedStatement接口是Statement的子接口，所以不用再写多一
    //个方法关闭PreparedStatement
    public static void closeStatement(Statement statement){
        try {
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //关闭ResultSet
    public static void closeResultSet(ResultSet resultSet){
        try {
            resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    //DML操作时关闭资源
    public static void closeResource(Statement statement,Connection connection){
        //先关闭Statement对象，再关闭Connection
        closeStatement(statement);
        closeConnection(connection);
    }
    //查询时关闭资源,方法可以重载，所以可以同名
    public static void closeResource(ResultSet resultSet,Statement statement,Connection connection){
        //后用先关
        //先关闭ResultSet
        closeResultSet(resultSet);
        //在闭Statement对象
        closeStatement(statement);
        //最后关闭Connection对象
        closeConnection(connection);
    }
}
